﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crosland.Automotriz.Core;
using System.Data.SqlClient;
namespace Crosland.Automotriz.Data.Dao.Linq
{
    public class clsLog_Importaciones_DetDAOcs
    {

        private AutomotrizEntities ContextoDeObjs = new AutomotrizEntities();

        public bool Insertar2(List<T_IMP_IMPORTACION_DET> Obj)
        {
            try
            {
                foreach (T_IMP_IMPORTACION_DET d in Obj)
                {
                    ContextoDeObjs.AddObject("T_IMP_IMPORTACION_DET", d);
                }
                ContextoDeObjs.SaveChanges();
            }
            catch (Exception)
            {
                return false;
                throw;
            }
            return true;
        }

        public bool Insertar(T_IMP_IMPORTACION_DET Obj)
        {
            try
            {
                ContextoDeObjs.AddObject("T_IMP_IMPORTACION_DET", Obj);
                ContextoDeObjs.SaveChanges();
            }
            catch (Exception)
            {
                return false;
                throw;
            }
            return true;
        }

        public bool Modificar(T_IMP_IMPORTACION_DET obj)
        {
            try
            {
                ContextoDeObjs.AttachTo("T_IMP_IMPORTACION_DET", obj);
                ContextoDeObjs.ObjectStateManager.ChangeObjectState(obj, System.Data.EntityState.Modified);
                ContextoDeObjs.SaveChanges();
            }
            catch (Exception)
            {
                return false;

            }
            return true;
        }

        public bool Eliminar(T_IMP_IMPORTACION_DET obj)
        {
            try
            {
                ContextoDeObjs.AttachTo("T_IMP_IMPORTACION_DET", obj);
                ContextoDeObjs.DeleteObject(obj);
                ContextoDeObjs.SaveChanges();
            }
            catch (Exception)
            {
                return false;
            }
            return true;
        }

        public bool EliminarDetalle(int ID_IMP_IMPORTACION_CAB, string cod_titpo_pedido)
        {
            try
            {
                ContextoDeObjs.ExecuteStoreCommand("DELETE FROM T_IMP_IMPORTACION_DET WHERE ID_IMP_IMPORTACION_CAB=" + ID_IMP_IMPORTACION_CAB + " AND COD_TIPO_PEDIDO='" + cod_titpo_pedido + "'");
                return true;
            }
            catch (SqlException ex)
            {
                Globales.msjSql = ex.Message;
                return false;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public bool InsertarDetalle(int ID_IMP_IMPORTACION_CAB, int ID_ORG_VTA, string NUM_PEDIDO, string COD_TIPO_PEDIDO, int NUM_ITEM_PED, int ID_MATERIAL, string COD_MATERIAL, string DES_MATERIAL_IMP, string CAJA, decimal CANT_IMP, decimal FOB_ME, decimal TOTAL_FOB_ME, int ID_PRONOSTICO_TIPO)
        {
            try
            {
                ContextoDeObjs.CommandTimeout = 600;
                ContextoDeObjs.ExecuteStoreCommand("EXEC USP_INSERTAR_IMP_IMPORTACION_DET @ID_IMP_IMPORTACION_CAB={0}, @ID_ORG_VTA={1},@NUM_PEDIDO={2},@COD_TIPO_PEDIDO={3},@NUM_ITEM_PED={4},@ID_MATERIAL={5},@COD_MATERIAL={6},@DES_MATERIAL_IMP={7},@CAJA={8},@CANT_IMP={9},@FOB_ME={10},@TOTAL_FOB_ME={11},@ID_PRONOSTICO_TIPO={12}", ID_IMP_IMPORTACION_CAB,ID_ORG_VTA, NUM_PEDIDO, COD_TIPO_PEDIDO, NUM_ITEM_PED, ID_MATERIAL, COD_MATERIAL, DES_MATERIAL_IMP, CAJA, CANT_IMP, FOB_ME, TOTAL_FOB_ME, ID_PRONOSTICO_TIPO);
                return true;
            }
            catch (SqlException ex)
            {

                Globales.countRegistros++;
                Globales.msjSql = ex.Message;

                return false;
            }
            catch (Exception ex)
            {
                
                Globales.countRegistros++;

                throw ex;
            }


        }



        public bool USP_TD_FOB_ACTUALIZA_PRECIO_FOB()
        {
            try
            {
                ContextoDeObjs.CommandTimeout = 600;
                ContextoDeObjs.ExecuteStoreCommand("EXEC  USP_TD_FOB_ACTUALIZA_PRECIO_FOB");
            }
            catch (SqlException ex)
            {

                throw ex;
            }
            catch (Exception ex) {

                throw ex;
            }

            return true;
        }



        public bool USP_T_IMP_IMPORTACION_DET_ACTUALIZA_FOB(int ID_IMP_IMPORTACION_CAB)
        {

            try
            {
                ContextoDeObjs.CommandTimeout = 600;
                ContextoDeObjs.ExecuteStoreCommand("EXEC USP_T_IMP_IMPORTACION_DET_ACTUALIZA_FOB @ID_IMP_IMPORTACION_CAB={0}", ID_IMP_IMPORTACION_CAB);

            }
            catch (SqlException ex)
            {

                throw ex;
            }
            catch (Exception ex) {
                throw ex;
            
            }

            return true;
        }


        public List<T_IMP_IMPORTACION_DET> listar()
        {

            List<T_IMP_IMPORTACION_DET> lista = new List<T_IMP_IMPORTACION_DET>();
            try
            {
                var q = from c in ContextoDeObjs.T_IMP_IMPORTACION_DET
                        select c;
                lista = q.ToList();

            }
            catch (Exception)
            {
            }
            return lista;
        }

        public List<IMPORTACION_DET> listar(String strNumPedido)
        {
            List<IMPORTACION_DET> lista = new List<IMPORTACION_DET>();
            //IEnumerable<Object> lista = new List<IMPORTACION_DET>();

            try
            {
                //  var q = from det in ContextoDeObjs.t
                var q = from det in ContextoDeObjs.T_IMP_IMPORTACION_DET
                        orderby
                          det.NUM_PEDIDO,
                          det.NUM_ITEM_PED
                        select new IMPORTACION_DET
                        {
                            ID_MATERIAL = det.ID_MATERIAL,
                            COD_MATERIAL = det.COD_MATERIAL,
                            DES_MATERIAL = det.DES_MATERIAL_IMP,
                            ID_COLOR = null,
                            DES_COLOR = "",
                            CAJA = det.CAJA,
                            CANT_IMP = det.CANT_IMP,
                            FOB_ME = det.FOB_ME,
                            TOTAL_FOB_ME = det.TOTAL_FOB_ME,
                            ID_PRONOSTICO_TIPO = det.ID_PRONOSTICO_TIPO,
                            COD_TIPO_PEDIDO = det.COD_TIPO_PEDIDO,
                            ID_ORG_VTA = det.ID_ORG_VTA,
                            NUM_PEDIDO = det.NUM_PEDIDO
                        };
                if (strNumPedido != String.Empty) q = q.Where(f1 => f1.NUM_PEDIDO.ToUpper() == strNumPedido.ToUpper());
                lista = q.ToList();
            }
            catch (Exception)
            {
                lista = null;
            }

            return lista;
        }

        public List<IMPORTACION_DET> listar_Antes(String strNumPedido, String strCodTipoPedido)
        {
            List<IMPORTACION_DET> lista = new List<IMPORTACION_DET>();

            try
            {
                var q = from det in ContextoDeObjs.T_IMP_IMPORTACION_DET
                        //from color in ContextoDeObjs.TD_COLOR on det.ID_COLOR equals color.ID_COLOR
                        orderby
                          det.NUM_PEDIDO,
                          det.NUM_ITEM_PED
                        select new IMPORTACION_DET
                        {
                            ID_MATERIAL = det.ID_MATERIAL,
                            COD_MATERIAL = det.COD_MATERIAL,
                            DES_MATERIAL = det.DES_MATERIAL_IMP,
                            ID_COLOR = null,
                            DES_COLOR = "",
                            CAJA = det.CAJA,
                            CANT_IMP = det.CANT_IMP,
                            FOB_ME = det.FOB_ME,
                            TOTAL_FOB_ME = det.TOTAL_FOB_ME,
                            ID_PRONOSTICO_TIPO = det.ID_PRONOSTICO_TIPO,
                            COD_TIPO_PEDIDO = det.COD_TIPO_PEDIDO,
                            ID_ORG_VTA = det.ID_ORG_VTA,
                            NUM_PEDIDO = det.NUM_PEDIDO

                        };
                if (strNumPedido != String.Empty) q = q.Where(f1 => f1.NUM_PEDIDO.ToUpper() == strNumPedido.ToUpper());
                if (strCodTipoPedido != String.Empty) q = q.Where(f1 => f1.COD_TIPO_PEDIDO.ToUpper() == strCodTipoPedido.ToUpper());
                lista = q.ToList();
            }
            catch (Exception)
            {
                lista = null;
            }

            return lista;
        }

        public List<IMPORTACION_DET> listar(int idCab, String strCodTipoPedido)
        {
            List<IMPORTACION_DET> lista = new List<IMPORTACION_DET>();

            try
            {
                var q = from det in ContextoDeObjs.T_IMP_IMPORTACION_DET
                        join c in ContextoDeObjs.TD_COLOR on det.ID_COLOR.Value equals c.ID_COLOR into j1
                        from j in j1.DefaultIfEmpty()
                        orderby
                            //det.NUM_PEDIDO,
                          det.ID_IMP_IMPORTACION_CAB,
                          det.NUM_ITEM_PED
                        select new IMPORTACION_DET
                        {
                            NUM_ITEM_PED = det.NUM_ITEM_PED,
                            ID_MATERIAL = det.ID_MATERIAL,
                            COD_MATERIAL = det.COD_MATERIAL,
                            DES_MATERIAL = det.DES_MATERIAL_IMP,
                            ID_COLOR = j.ID_COLOR,
                            DES_COLOR = j.DES_COLOR,
                            CAJA = det.CAJA,
                            CANT_IMP = det.CANT_IMP,
                            FOB_ME = det.FOB_ME,
                            TOTAL_FOB_ME = det.TOTAL_FOB_ME,
                            ID_PRONOSTICO_TIPO = det.ID_PRONOSTICO_TIPO,
                            COD_TIPO_PEDIDO = det.COD_TIPO_PEDIDO,
                            ID_ORG_VTA = det.ID_ORG_VTA,
                            NUM_PEDIDO = det.NUM_PEDIDO,
                            ID_IMP_IMPORTACION_CAB = det.ID_IMP_IMPORTACION_CAB
                        };

                //if (strNumPedido != String.Empty) q = q.Where(f1 => f1.NUM_PEDIDO.ToUpper() == strNumPedido.ToUpper());

//                if (idCab != null) q = q.Where(f1 => f1.ID_IMP_IMPORTACION_CAB == idCab);
                q = q.Where(f1 => f1.ID_IMP_IMPORTACION_CAB == idCab);
                if (strCodTipoPedido != String.Empty) q = q.Where(f1 => f1.COD_TIPO_PEDIDO.ToUpper() == strCodTipoPedido.ToUpper());

                lista = q.ToList();
            }
            catch (Exception)
            {
                lista = null;
            }

            return lista;
        }

        public List<T_IMP_IMPORTACION_DET> listarFiltroDetalle(string num_pedido, string cod_tipo_pedido)
        {
            List<T_IMP_IMPORTACION_DET> lista = new List<T_IMP_IMPORTACION_DET>();
            try
            {
                var q = (from c in ContextoDeObjs.T_IMP_IMPORTACION_DET
                         where c.NUM_PEDIDO == num_pedido && c.COD_TIPO_PEDIDO == cod_tipo_pedido
                         select c).Take(1);
                lista = q.ToList();
            }
            catch (Exception)
            {
                lista = null;
                throw;
            }
            return lista;
        }

        public Boolean verificarCodTipoPedido(int idCab, String strCodTipoPedido)
        {
            Boolean boolVerificarCodTipoPedido = true;
            IEnumerable<Object> lista = new List<Object>();
            try
            {
                var q = from t in
                            (from t in ContextoDeObjs.T_IMP_IMPORTACION_DET
                             where
                               1 == 1 &&
                                 //t.NUM_PEDIDO == strNumPedido &&
                               t.ID_IMP_IMPORTACION_CAB == idCab &&
                               t.COD_TIPO_PEDIDO == strCodTipoPedido
                             select new
                             {
                                 Dummy = "x"
                             })
                        group t by new { t.Dummy } into g
                        select new
                        {
                            Cantidad = (Int32?)g.Count()
                        };
                lista = q.ToList();
                if (lista.Count() > 0)
                {
                    int? cantidad = q.ToList()[0].Cantidad;

                    if (cantidad != null && cantidad > 0)
                    {
                        boolVerificarCodTipoPedido = false;
                    }
                    else
                    {
                        boolVerificarCodTipoPedido = true;
                    }
                }
                else
                {
                    boolVerificarCodTipoPedido = true;
                }

            }
            catch (Exception)
            {
                boolVerificarCodTipoPedido = false;
            }

            return boolVerificarCodTipoPedido;
        }


        public IEnumerable<Object> ImportacionDET(int ID_IMP_CAB)
        {

            IEnumerable<Object> lista = new List<Object>();
            try
            {

                lista = ContextoDeObjs.USP_LOG_IMPORTACIONES_DET(ID_IMP_CAB);

            }
            catch (Exception)
            {
            }
            return lista;
        }

        public bool PA_ELIMINAR_LOG(string num_pedido)
        {

            try
            {

                ContextoDeObjs.ExecuteStoreCommand("exec PA_ELIMINAR_LOG '" + num_pedido + "'");
                return true;
            }
            catch (SqlException ex)
            {


                Globales.msjSql = ex.Message;

                return false;
            }
            catch (Exception)
            {
                return false;
            }

        }

        public int RetorIDTipoPronostico(string des_corta)
        {

            var queryText = "SELECT tmtgd.ID_GENERAL_DET FROM T_MAE_TABLA_GENERAL_CAB tmtgc  INNER JOIN T_MAE_TABLA_GENERAL_DET tmtgd ON tmtgd.ID_GENERAL_CAB = tmtgc.ID_GENERAL_CAB  WHERE tmtgc.NOM_TABLA='T_IMP_PRONOSTICO_TIPO'AND tmtgd.DES_CORTA='" + des_corta + "'";

            var lisr = ContextoDeObjs.ExecuteStoreQuery<int>(queryText).ToList();

            return lisr.FirstOrDefault();
        }

        public int RetorIDMaterial(string strCodigoMaterial)
        {
            try
            {
                var SqlScript = "SELECT tm.ID_MATERIAL FROM TD_MATERIAL tm WHERE tm.COD_MATERIAL='" + strCodigoMaterial + "'";
                var varIdMaterial = ContextoDeObjs.ExecuteStoreQuery<int>(SqlScript).ToList();
                return varIdMaterial.FirstOrDefault();
            }
            catch (Exception ex)
            {
                return 0;
            }           
        }


        public int RetorIDMaterialKawasaki(string strCodigoMaterial)
        {
            try
            {
                var SqlScript = "SELECT tm.ID_MATERIAL FROM TD_MATERIAL tm WHERE tm.id_grupo_articulo in (22,31,32) and tm.COD_MATERIAL='" + strCodigoMaterial + "'";
                var varIdMaterial = ContextoDeObjs.ExecuteStoreQuery<int>(SqlScript).ToList();
                return varIdMaterial.FirstOrDefault();
            }
            catch (Exception)
            {
                return 0;
            }
        }


        public int Verificacion(int nro_pronostico,int id_material) {
            try
            {
                var q = String.Format("SELECT  tpid.Nro_Pronostico FROM TH_PRONOSTICO_IMP_DET tpid WHERE tpid.Nro_Pronostico={0} AND tpid.id_material={1}", nro_pronostico, id_material);
                var List = ContextoDeObjs.ExecuteStoreQuery<int>(q).ToList();
                return List.FirstOrDefault();       
            }
            catch (Exception ex)
            {
                
                throw ex;
            }

            
        }

        public bool InsertarArticulosExcel(int nro_pronostico, int id_material, decimal cant_sug_real, decimal cant_sug, decimal fob_me, int id_pronostico_tipo,String tipo_abc,String tipo_abc_can)
        {
             ContextoDeObjs.ExecuteStoreCommand(String.Format("INSERT INTO TH_PRONOSTICO_IMP_DET(Nro_Pronostico,id_material,cant_sug_real,cant_sugerida,fob_me,ID_PRONOSTICO_TIPO,TIPO_ABC,TIPO_ABC_CAN)VALUES({0},{1},{2},{3},{4},{5},'{6}','{7}')", nro_pronostico, id_material, cant_sug_real, cant_sug, fob_me, id_pronostico_tipo, tipo_abc, tipo_abc_can));
             return true;           
            
        }


        public bool InsertarImportacionCab(int id_org_vta,String num_pedido,String num_pedido_org,int id_ofi_vta,String cod_imp_estado,String fecha_llegada_puerto,int id_proveedor)
        { try
        {
                ContextoDeObjs.ExecuteStoreCommand(String.Format("INSERT INTO T_IMP_IMPORTACION_CAB (ID_ORG_VTA,NUM_PEDIDO,NUM_PEDIDO_ORIG,ID_OFI_VTA,COD_IMP_ESTADO,FEC_LLEG_EST_PUERTO,ID_PROVEEDOR) VALUES ({0},'{1}','{2}',{3},'{4}','{5}',{6})", id_org_vta, num_pedido, num_pedido_org, id_ofi_vta, cod_imp_estado, fecha_llegada_puerto,id_proveedor));
                return true;
            }catch {
                return false;
            }
        }


        public int RetornarUltimoNumeroImpCab() {
            try
            {
                var queryText = String.Format("select max(ID_IMP_IMPORTACION_CAB) from T_IMP_IMPORTACION_CAB");
                var lisr = ContextoDeObjs.ExecuteStoreQuery<int>(queryText).ToList();
                return lisr.FirstOrDefault();

            }
            catch (Exception)
            {
                return 0;
            }
        }



        public bool EliminarDetCab(string num_pedido)
        {
            try
            {
                ContextoDeObjs.ExecuteStoreCommand(String.Format("DELETE FROM T_IMP_IMPORTACION_DET WHERE NUM_PEDIDO='{0}'", num_pedido));
                ContextoDeObjs.ExecuteStoreCommand(String.Format("DELETE FROM T_IMP_IMPORTACION_CAB WHERE NUM_PEDIDO='{0}'", num_pedido));
                return true;
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}
